package br.ufms.odontologico.bo;

import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.persistence.EntityTransaction;
import javax.persistence.Query;

import br.ufms.odontologico.model.Agendamento;
import br.ufms.odontologico.model.Cliente;
import br.ufms.odontologico.model.Dentista;
@ManagedBean
@ViewScoped
public class AgendamentoBO {
	@ManagedProperty("#{genericBO}")
	private GenericBO<Agendamento> gbo;
	
	public Boolean cancelarAgendamento(Agendamento agendamento) {
		Boolean res = true;
		try{
			gbo.delete(agendamento);
		}catch (Exception e) {
			e.printStackTrace();
			res = false;
		}
		return res;
	}

	public Agendamento novoAgendamento(Cliente cliente,Dentista dentista,Calendar inicio) {
		Agendamento ag = new Agendamento();
		EntityTransaction t = null;
		try{
			ag.setCliente(cliente);
			ag.setDentista(dentista);
			ag.setInicio(inicio);
			t = gbo.getEm().getTransaction();
			t.begin();
			gbo.insert(ag);
			t.commit();
		}catch (Exception e) {
			t.rollback();
			e.printStackTrace();
			ag=null;
		}
		return ag;
	}

	@SuppressWarnings("unchecked")
	public List<Agendamento> carregarAgendamentos(Dentista dentista){
		List<Agendamento> res=null;
		EntityTransaction t=null;
		try {
			t = gbo.getEm().getTransaction();
			t.begin();
			Query qr = gbo
					.getEm()
					.createQuery(
							"from Agendamento where dentista = ? and inicio >= ? order by inicio");
			qr.setParameter(1, dentista);
			GregorianCalendar inicio = new GregorianCalendar();
			inicio.set(Calendar.HOUR_OF_DAY, 0);
			inicio.set(Calendar.MINUTE, 0);
			inicio.set(Calendar.SECOND, 0);
			inicio.set(Calendar.MILLISECOND, 0);
			qr.setParameter(2, inicio);
			res = (List<Agendamento>) qr.getResultList();
			t.commit();
		} catch (Exception e) {
			t.rollback();
		}
		return res;
	}
	
	public GenericBO<Agendamento> getGbo() {
		return gbo;
	}

	public void setGbo(GenericBO<Agendamento> gbo) {
		this.gbo = gbo;
	}

	public Boolean insert(Agendamento obj) {
		return gbo.insert(obj);
	}

	public Agendamento update(Agendamento obj) {
		return gbo.update(obj);
	}

	public Agendamento updateOnly(Agendamento obj) {
		return gbo.updateOnly(obj);
	}

	public Boolean delete(Agendamento obj) {
		return gbo.delete(obj);
	}

	public Boolean delete(List<Agendamento> obj) {
		return gbo.delete(obj);
	}
	
	
}
